package cn.tedu.csmall.business.service.impl;

import cn.tedu.csmall.business.service.IBusinessService;
import cn.tedu.csmall.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall.order.service.IOrderService;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;


@Service
@Slf4j
public class BusinessServiceImpl implements IBusinessService {

    // Dubbo调用order模块实现新增订单功能
    // 提交我们业务逻辑层方法中定义的OrderAddDTO对象
    // business模块是单纯的消费者,不需要在类上编写@DubboService注解
    @DubboReference
    private IOrderService dubboOrderService;

    // Global:全局   Transactional:事务
    // 一旦这个业务逻辑层方法上添加了@GlobalTransactional注解
    // 就相当于设置了分布式事务的起点,相当于AT模型中的TM(事务管理器)
    // 效果时,从这个方法开始,远程调用的所有其他方法,对数据库的操作,在同一个事务中,有原子性特征
    // 如果其中任何一个分支(包括当前方法)发生异常,所有数据库操作(包括远程数据库操作)都会回滚


    @GlobalTransactional
    @Override
    public void buy() {
        // 先实例化一个订单的DTO对象
        OrderAddDTO orderAddDTO=new OrderAddDTO();
        orderAddDTO.setUserId("UU100");
        orderAddDTO.setCommodityCode("PC100");
        orderAddDTO.setCount(10);
        orderAddDTO.setMoney(100);
        // 输出到日志即可
        log.info("新增的订单信息为:{}",orderAddDTO);
        // dubbo调用order模块完成订单的新增流程
        dubboOrderService.orderAdd(orderAddDTO);
    }
}













